package com.example.demo.generate;

import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.ColumnConfig;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.zaxxer.hikari.HikariDataSource;

public class Codegen {

    public static void main(String[] args) {
        //配置数据源
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/web?characterEncoding=utf-8");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");

        GlobalConfig globalConfig = genSoftDefEntity();

        // GlobalConfig globalConfig = createTableDef();
        //创建配置内容，两种风格都可以。
        // GlobalConfig globalConfig = createGlobalConfigUseStyleOne();
        // GlobalConfig globalConfig = createGlobalConfigUseStyleTwo();

        //通过 datasource 和 globalConfig 创建代码生成器
        Generator generator = new Generator(dataSource, globalConfig);

        //生成代码
        generator.generate();
    }

    public static GlobalConfig genSoftDefEntity() {
        // 不会覆盖！表结构变了，选哟删除再生成
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setBasePackage("com.example.demo");
        globalConfig.setTablePrefix("tb_");
        globalConfig.setGenerateTable("tb_soft");

        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);
        globalConfig.setTableDefGenerateEnable(true);

        return globalConfig;
    }

    public static GlobalConfig createTableDef() {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();

        //设置根包
        globalConfig.setBasePackage("com.example.demo");

        globalConfig.setTablePrefix("tb_");
        globalConfig.setGenerateTable("tb_order_good");
        globalConfig.setGenerateTable("tb_account_order");

        //设置生成 entity 并启用 Lombok
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);

        globalConfig.setTableDefGenerateEnable(true);

        return globalConfig;

    }

    public static GlobalConfig createGlobalConfigUseStyleOne() {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();

        //设置根包
        globalConfig.setBasePackage("com.example.demo");

        //设置表前缀和只生成哪些表
        globalConfig.setTablePrefix("tb_");
        globalConfig.setGenerateTable("tb_soft");

        //设置生成 entity 并启用 Lombok
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);

        //设置生成 mapper
        globalConfig.setMapperGenerateEnable(true);
        globalConfig.setServiceGenerateEnable(true);
        globalConfig.setServiceImplGenerateEnable(true);
        globalConfig.setControllerGenerateEnable(true);
        globalConfig.setTableDefGenerateEnable(true);
        globalConfig.setMapperXmlGenerateEnable(true);

        //可以单独配置某个列 // 这样设置id查出来是空的！！
        ColumnConfig columnConfig = new ColumnConfig();
        columnConfig.setColumnName("id");
        columnConfig.setLarge(true);
        columnConfig.setVersion(true);
        globalConfig.setColumnConfig("tb_soft", columnConfig);

        return globalConfig;
    }

    public static GlobalConfig createGlobalConfigUseStyleTwo() {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();

        //设置根包
        globalConfig.getPackageConfig()
                .setBasePackage("com.example.demo");

        //设置表前缀和只生成哪些表，setGenerateTable 未配置时，生成所有表
        globalConfig.getStrategyConfig()
                .setTablePrefix("tb_")
                .setGenerateTable("tb_soft");

        //设置生成 entity 并启用 Lombok
        globalConfig.enableEntity()
                .setWithLombok(true);

        //设置生成 mapper
        globalConfig.enableMapper();

        // 设置生成 service 设置生成 ServiceImpl
        globalConfig.enableService();
        globalConfig.enableServiceImpl();

        // 设置生成 Controller
        globalConfig.enableController();

        // 设置生成 TableDef
        globalConfig.enableTableDef();

        // 设置生成 MapperXml
        globalConfig.enableMapperXml();


        //可以单独配置某个列
        ColumnConfig columnConfig = new ColumnConfig();
        columnConfig.setColumnName("soft_id");
        columnConfig.setLarge(true);
        columnConfig.setVersion(true);
        globalConfig.getStrategyConfig()
                .setColumnConfig("tb_soft", columnConfig);

        return globalConfig;
    }
}